package com.atguigu.srb.core.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.atguigu.srb.core.pojo.entity.Dict;
import com.atguigu.srb.core.pojo.vo.DictExcelVO;
import com.atguigu.srb.core.service.DictService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * ClassName: DictExcelVOListener
 * Package: com.atguigu.srb.core.listener
 * Description:
 *
 * @Author 刘强
 * @Create 2024/4/17 11:43
 * @Version 1.0
 */
// 读取excel文件的监听器
@Component  // 依赖注入，是组件之间的依赖注入，要求依赖注入的组件所在类为组件类
public class DictExcelVOListener extends AnalysisEventListener<DictExcelVO> {
    @Autowired
    private DictService dictService;
    private List<Dict> dictList = new ArrayList<>();  // 缓冲区
    private List<Dict> targetDictList = new ArrayList<>();  // 最终要插入到数据库的列表
    private Integer size = 10;  // 缓冲区的大小
    //  读取一条记录调用一次
    @Override
    public void invoke(DictExcelVO dictExcelVO, AnalysisContext analysisContext) {
        dictList.add(convertDictExcelVO2Dict(dictExcelVO));
        if(dictList.size() == size){ // 缓冲区满了，刷新缓冲区
            // 保存到数据库之前，先检查是否已经存在，即根据id判断是否已经存在
            for (Dict dict:dictList){
                Dict dictById = dictService.getById(dict.getId());
                if(dictById == null){
                    targetDictList.add(dict);
                }
            }
            // 刷新缓冲区
            dictService.saveBatch(targetDictList);
            targetDictList.clear();
            dictList.clear();
        }
    }

    //  读取结束后调用一次
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        // 手动刷新没有自动刷新缓冲区
        if(targetDictList.size() > 0){
            dictService.saveBatch(targetDictList);
            targetDictList.clear();
        }
    }
    public Dict convertDictExcelVO2Dict(DictExcelVO dictExcelVO){
        Dict dict = new Dict();
        BeanUtils.copyProperties(dictExcelVO,dict);  // 将一个对象的属性值 复制给另一个对象 BeanUtils--->前提：属性类型和属性名相同
        return dict;
    }
}
